<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>队列-基于数组的队列结构封装</title>
</head>
<body>
  <script>
    /**
    * 队列（先进先出）
    */
    function Queue () {
      this.items = [];
      
      // enQueue，进队列
      Queue.prototype.enQueue = function (ele) {
        this.items.push(ele);
      }

      // deQueue，出队列
      Queue.prototype.deQueue = function () {
        return this.items.shift();
      }

      // front，查看队列的第一个元素
      Queue.prototype.front = function () {
        return this.items[0];
      }

      // isEmpty,查看队列是否为空
      Queue.prototype.isEmpty = function () {
        return this.items.length > 0;
      }

      // size,查看队列的个数
      Queue.prototype.size = function () {
        return this.items.length;
      }

      // toString,将队列元素转换为字符串
      Queue.prototype.toString = function () {
        return this.items.map(ele => ele.toString());
      }
    }


    // 击鼓传花游戏（实践）
    // 规则：数到指定数字的人被淘汰，然后从下一个人开始重新从1开始数，直到剩下一个人

    // peoples: 游戏的总人数
    // num: 指定的游戏卡点数字
    function game (peoples, num) {
      const queue = new Queue();
      peoples.forEach(p => {
        queue.enQueue(p)
      });
     
      while (queue.size() > 1) {
        for (let index = 0; index < num - 1; index++) {
          const firstPeople = queue.deQueue();
          // 将说num的前面的所有人人都依次移动到队列的末尾
          queue.enQueue(firstPeople);
        }
        // 删除掉说出num的人
        queue.deQueue();
      } 
      // 返回剩余的那个人
      return queue.front();
    }

    const peoples = ['cs', 'xm', 'll', 'hh'];
    const last = game(peoples, 3);
    console.log('last', last);
  </script>
</body>
</html>